/*
 * IRRemote.c
 *
 *  Created on: Dec 6, 2024
 *      Author: admire
 */

#include "IRRemote.h"
#include "gpio.h"
#include "stdbool.h"

uint32_t infrared_RxData; 	//接收数据变量
bool infrared_RxFlag;		//红外接收完一帧数据标志

/**
 * 微秒级延时函数
 * 参数		time：延时微秒数
 * 返回值		无
 * 说明：		本延时函数所用系统时钟为72MHz。
 */
void delay_us(uint16_t time)
{
	uint16_t i=0;
   while(time--)
   {
      i=6;
      while(i--) ;
   }
}

/**
 * NEC红外接收函数
 * 参数		无
 * 返回值		无
 * 说明：		本程序采用测量高电平的时间，从而判断起始位和数据位
 */
void infrared_receive(void)
{
	uint8_t Tim=0,Ok=0,Data=0,Num=0;
	while(1)
	{
		if(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 1)
		{
			Tim = 0;
			while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_5) == 1)//高电平
			{
				Tim++;
				delay_us(100);
				if(Tim >= NEC_HEADER_MAX)
					break;	//超时溢出
			}

			if(Tim >= NEC_HEADER_MAX)
				break;//不是有用的信号

			if(Tim >= NEC_HEADER_MIN && Tim < NEC_HEADER_MAX)
			{
				Ok=1;//收到起始信号
			}
			else if(Tim >= NEC_BIT_1_MIN && Tim < NEC_BIT_1_MAX)
			{
				Data=1;//收到数据 1
			}
			else if(Tim >= NEC_BIT_0_MIN && Tim < NEC_BIT_0_MAX)
			{
				Data=0;//收到数据 0
			}

			if(Ok == 1)
			{
				infrared_RxData <<= 1;
				infrared_RxData += Data;
				if(Num >= 32)
				{
					infrared_RxFlag = 1;
					break;
				}
			}
			Num++;
		}
   }
}
